home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok52 / togglewin / togglewin.mod < prev    next >
Text File  |  1993-11-04  |  9KB  |  313 lines

  1. (*---------------------------------------------------------------------------
  2.  -Programm:   ToggleWin
  3.  -Autor:      Hans Jörg Schmölz
  4.  -Adresse:    Eulen 2, D-8961 Sulzberg
  5.  -Datum:      04.03.1991
  6.  -Copyright:  PD
  7.  -Sprache:    Oberon
  8.  -Compiler:   Amiga Oberon Compiler V1.17.1
  9.  -Format:     ToggleWin [DepthKey [saAc]]
  10.  -Zweck:      ToggleWin erleichtert das Hantieren mit Windows.
  11.  -Bedienung:  Mit der Depth-Taste (default: Enter im 10er-Block) können
  12.               können Sie die Windows, über denen sich gerade der Maus-
  13.               zeiger befindet, durchblättern.
  14.  -Bemerkung:  ToggleWin ist eine Variation des PD-Programms KeyMac
  15.               auf Oberon-Disk3 von Fridtjof Siebert. Ein Großteil des
  16.               Quelltextes wurde einfach übernommen.
  17.  -Achtung:    Das Programm darf nicht mit der Option SmallData
  18.               compiliert werden!
  19. ---------------------------------------------------------------------------*)
  20. MODULE ToggleWin;
  21.  
  22. IMPORT  NoGuruRq, BreakRq,
  23.         ie:   InputEvent,
  24.         e:    Exec,
  25.         es:   ExecSupport,
  26.               Input,
  27.         rq:   Requests,
  28.         arg:  Arguments,
  29.         cv:   Conversions,
  30.         d:    Dos,
  31.         g:    Graphics,
  32.         I:    Intuition,
  33.         L:    Layers,
  34.         sys:  SYSTEM;
  35.  
  36. (*-----------------------------------------------------------------------
  37.   Porzesser-Register:
  38. -----------------------------------------------------------------------*)
  39. CONST
  40.   D0 = 0; D1 = 1; D2 = 2; D3 = 3; D4 = 4; D5 = 5; D6 = 6; D7 = 7;
  41.   A0 = 8; A1 = 9; A2 =10; A3 =11; A4 =12; A5 =13; A6 =14; A7 =15;
  42.  
  43.   PortName  = "ToggleWin.Port";
  44.   ReplyName = "ToggleWin.ReplyPort";
  45.  
  46. (* Qualifiers: *)
  47.   shift = 0; alt = 1; ctrl = 2; amiga = 3;
  48.  
  49. (* Actions: *)
  50.   null = 0; depth = 1; activate = 2;
  51.  
  52. VAR
  53.   IDP: e.MsgPortPtr;
  54.   IRB: e.IOStdReqPtr;
  55.   HandlerStuff: e.InterruptPtr;
  56.   HandlerActive,InputOpen: BOOLEAN;
  57.   DepthKey  : INTEGER;
  58.   DepthQual : SET;
  59.   MySig: LONGINT;
  60.   SigSet: LONGSET;
  61.   Me: e.TaskPtr;
  62.   ev,Ev: ie.InputEventPtr;
  63.   MyMsg: e.Message;
  64.   QuitMessage: e.MessagePtr;
  65.   MyPort, OldPort: e.MsgPortPtr;
  66.   args, argNr:  INTEGER;
  67.  
  68.   Action: INTEGER;
  69.   Xcoord, Ycoord: INTEGER;
  70.   Window: I.WindowPtr;
  71.   Layer: g.LayerPtr;
  72.   layerinfo: g.LayerInfoPtr;
  73.  
  74. TYPE
  75.   PROC = PROCEDURE();
  76.  
  77. (*-------------------------------------------------------------------------*)
  78.  
  79. PROCEDURE Err; BEGIN HALT(20) END Err;
  80.  
  81. PROCEDURE Usage;
  82.  
  83. BEGIN
  84.   IF rq.Request("ToggleWin Usage:",
  85.                 "ToggleWin [DepthKey [saAc]]",
  86.                 "","Cancel") THEN END;
  87.   Err;
  88. END Usage;
  89.  
  90. (*---------------------  Check Qualifier:  --------------------------------*)
  91.  
  92. PROCEDURE CheckQuali(Quali: SET; Qual: SET): BOOLEAN;
  93. (* this checks the specified Keys in Qual (SHIFT,ALT,CTRL,AMIGA) whether   *)
  94. (* they are in Quali (left or right is unimportent) or not.                *)
  95.  
  96. BEGIN
  97.  RETURN ((shift IN Qual) = (ie.lShift   IN Quali) OR (ie.rShift   IN Quali))
  98.     AND ((alt   IN Qual) = (ie.lAlt     IN Quali) OR (ie.rAlt     IN Quali))
  99.     AND ((amiga IN Qual) = (ie.lCommand IN Quali) OR (ie.rCommand IN Quali))
  100.     AND ((ctrl  IN Qual) = (ie.control  IN Quali));
  101. END CheckQuali;
  102.  
  103. (*--------------------  Initialize Input.device:  -------------------------*)
  104.  
  105. PROCEDURE OpenInput;
  106. BEGIN
  107.   IDP := es.CreatePort (NIL,0); IF IDP=NIL THEN Err END;
  108.   IRB := es.CreateStdIO(IDP);   IF IRB=NIL THEN Err END;
  109.   HandlerStuff.data := NIL;
  110.   HandlerStuff.node.pri := 51;
  111.   IF (e.OpenDevice("input.device",0,IRB,LONGSET{})#0) OR
  112.      (IRB.error#0) THEN Err END;
  113.   InputOpen := TRUE;
  114. END OpenInput;
  115.  
  116. (*---------------------  Close Input-Device:  -----------------------------*)
  117.  
  118. PROCEDURE CloseInput;
  119.  
  120. BEGIN
  121.   IF InputOpen THEN e .CloseDevice(IRB) END;
  122.   IF IDP#NIL   THEN es.DeletePort (IDP) END;
  123.   IF IRB#NIL   THEN es.DeleteStdIO(IRB) END;
  124. END CloseInput;
  125.  
  126. (*---------------------------  AddHandler:  -------------------------------*)
  127.  
  128. PROCEDURE AddHandler(handler: PROC);
  129. BEGIN
  130.   HandlerStuff.code := handler;
  131.   IRB.command       := Input.addHandler;
  132.   IRB.data          := HandlerStuff;
  133.   e.DoIO(IRB);
  134. END AddHandler;
  135.  
  136. (*---------------------------  RemHandler:  -------------------------------*)
  137.  
  138. PROCEDURE RemHandler();
  139. BEGIN
  140.   IRB.command := Input.remHandler;
  141.   IRB.data    := HandlerStuff;
  142.   e.DoIO(IRB);
  143. END RemHandler;
  144.  
  145. (*------------------------  InputHandler:  --------------------------------*)
  146.  
  147. PROCEDURE * MyHandler;
  148.  
  149. (* $StackChk- $SaveRegs+ *)
  150.  
  151. VAR c: INTEGER;
  152.     q: SET;
  153.  
  154. BEGIN
  155.   ev := sys.REG(A0);
  156.   IF Action = activate THEN
  157.     e.Signal(Me,SigSet);
  158.   END;
  159.   Ev := ev;
  160.   WHILE ev#NIL DO
  161.     IF ev.class=ie.rawkey THEN
  162.       c := ev.code; q := ev.qualifier;
  163.       IF (c = DepthKey) AND CheckQuali(q, DepthQual) THEN
  164.         ev.class:= ie.null;
  165.         Action  := depth;
  166.         e.Signal(Me,SigSet);
  167.       END;
  168.     END;
  169.     ev := ev.nextEvent;
  170.   END;
  171.   sys.SETREG(D0, Ev);
  172. END MyHandler; (* $StackChk= *)
  173.  
  174. (*-------------------------------------------------------------------------*)
  175.  
  176. PROCEDURE GetQuali(VAR Argument: ARRAY OF CHAR): SET;
  177. VAR q: SET;
  178.     i: INTEGER;
  179. BEGIN
  180.   i := 0; q := {};
  181.   LOOP
  182.     CASE Argument[i] OF
  183.      0X, "0".."9": RETURN q |
  184.     "s": INCL(q,shift)      |
  185.     "a": INCL(q,alt)        |
  186.     "A": INCL(q,amiga)      |
  187.     "c": INCL(q,ctrl)       |
  188.     ELSE Usage END;
  189.     INC(i);
  190.   END;
  191. END GetQuali;
  192.  
  193. PROCEDURE GetKey(args: INTEGER; VAR argNr, key: INTEGER; VAR qual: SET);
  194.   VAR
  195.     Argument: ARRAY 80 OF CHAR;
  196.     help: LONGINT;
  197.   BEGIN
  198.     IF argNr > args THEN RETURN END;
  199.     arg.GetArg(argNr, Argument);
  200.     IF ~cv.StringToInt(Argument, help) THEN Usage;
  201.     ELSIF (help < 0) OR (help > 127) THEN Usage;
  202.     ELSE
  203.       key := SHORT(help);
  204.       qual:= {};
  205.       INC(argNr);
  206.       IF argNr > args THEN RETURN
  207.         ELSE
  208.           arg.GetArg(argNr, Argument);
  209.           qual:= GetQuali(Argument);
  210.           IF qual # {} THEN INC(argNr) END;
  211.         END;
  212.     END;
  213.   END GetKey;
  214.  
  215. (*------------------------  Intialisation:  -------------------------------*)
  216.  
  217. BEGIN (* ToggleWin *)
  218.  
  219.   HandlerActive := FALSE; InputOpen := FALSE; MySig := -1;
  220.   IDP  := NIL; IRB := NIL; MyPort := NIL;
  221.   NEW(HandlerStuff); IF HandlerStuff=NIL THEN Err END;
  222.  
  223.   Action:= null;
  224.   DepthKey    := 43H;   (* Enter im 10er-Block *)
  225.   DepthQual   := {};
  226.  
  227. (*------  Have we already been started?  ------*)
  228.  
  229.   OldPort := e.FindPort(PortName);
  230.   IF OldPort#NIL THEN
  231.     MyPort := es.CreatePort(sys.ADR(ReplyName),0);
  232.     IF MyPort=NIL THEN Err END;
  233.     MyMsg.node.type := e.message;
  234.     MyMsg.replyPort := MyPort;
  235.     e.PutMsg(OldPort,sys.ADR(MyMsg));
  236.     e.WaitPort(MyPort);
  237.     es.DeletePort(MyPort);
  238.     MyPort := NIL;
  239.     HALT(0);
  240.   END;
  241.   MyPort := es.CreatePort(sys.ADR(PortName),0);
  242.   IF MyPort=NIL THEN Err END;
  243.  
  244. (*------  Open everything we need:  ------*)
  245.  
  246.   OpenInput();
  247.   AddHandler(MyHandler);
  248.   HandlerActive := TRUE;
  249.  
  250.   Me := e.FindTask(NIL);
  251.   MySig := e.AllocSignal(-1);
  252.   IF MySig=-1 THEN Err END;
  253.   SigSet := LONGSET{MySig};
  254.  
  255. (*------  Arguments:  ------*)
  256.  
  257.   args := arg.NumArgs();
  258.   argNr:= 1;
  259.   GetKey(args, argNr, DepthKey, DepthQual);
  260. (*GetKey(args, argNr, ExtendKey, ExtendQual); --- für Erweiterungen ---*)
  261.  
  262. (*------- Main Loop: ---------*)
  263.  
  264.   LOOP
  265.     IF MyPort.sigBit IN e.Wait(LONGSET{MyPort.sigBit,MySig}) THEN EXIT
  266.     ELSE
  267.       layerinfo:= sys.ADR( I.int.activeScreen.layerInfo );
  268.       Xcoord:= I.int.activeScreen.mouseX;
  269.       Ycoord:= I.int.activeScreen.mouseY;
  270.       Layer := L.WhichLayer( layerinfo, Xcoord, Ycoord );
  271.       IF Layer # NIL THEN
  272.         Window:= Layer.window;
  273.         IF Window # NIL THEN
  274.           CASE Action OF
  275.             depth:
  276.               IF Layer = layerinfo.layer
  277.                 THEN
  278.                   I.WindowToBack  ( Window );
  279.                   Action:= activate;  (* Wird erst beim nächsten Interrupt
  280.                                          durchgeführt. So kann layerinfo vom
  281.                                          System neu initialisiert werden. *)
  282.                 ELSE
  283.                   I.WindowToFront ( Window );
  284.                   I.ActivateWindow( Window );
  285.                 END;
  286.           | activate:
  287.               I.ActivateWindow( Window );
  288.               Action:= null;
  289.           END;
  290.         END;
  291.       END;
  292.     END;
  293.   END;  (* LOOP *)
  294.  
  295. CLOSE
  296.  
  297.   IF HandlerActive THEN RemHandler() END;
  298.   CloseInput();
  299.   IF MySig#-1      THEN e.FreeSignal(MySig) END;
  300.   IF MyPort#NIL THEN
  301.     e.Forbid();
  302.       IF QuitMessage=NIL THEN QuitMessage := e.GetMsg(MyPort) END;
  303.       WHILE QuitMessage#NIL DO
  304.         e.ReplyMsg(QuitMessage);
  305.         QuitMessage := e.GetMsg(MyPort);
  306.       END;
  307.       es.DeletePort(MyPort);
  308.     e.Permit();
  309.   END;
  310.  
  311. END ToggleWin.
  312.  
  313.